package wetogether.travelinfo.service;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import wetogether.travelinfo.dao.OutputTravelInfoDAO;
import wetogether.travelinfo.vo.ListVO;
import wetogether.travelinfo.vo.PagingBean;
import wetogether.travelinfo.vo.TravelCommentVO;
import wetogether.travelinfo.vo.TravelFrVO;
import wetogether.travelinfo.vo.TravelImageVO;
import wetogether.travelinfo.vo.TravelInfoVO;
import wetogether.travelinfo.vo.TravelVacancyVO;
import wetogether.travelinfo.vo.TravelZoneVO;

public class OutputTravelInfoServiceImpl implements OutputTravelInfoService {
	private OutputTravelInfoDAO outputTravelInfoDAO;
	public void setOutputTravelInfoDAO(OutputTravelInfoDAO outputTravelInfoDAO){
		this.outputTravelInfoDAO=outputTravelInfoDAO;
		System.out.println("OutputTravelInfoDAO injection....");
	}
	/**
	 * 지역정보 모두 가져오기 - 이미지, 랭킹
	 */
	@Override
	public Map getTravelZoneOutput(int locationid) throws SQLException {
		Map totalMap = new HashMap();
		List<TravelImageVO> list=new ArrayList();
		TravelZoneVO zoneVO = outputTravelInfoDAO.getTravelZone(locationid);
		totalMap.put("zoneVO", zoneVO);
		// 지역에 있는 여행지를 모두 가져온다.
		List<String> pList = outputTravelInfoDAO.findTravelPlaceList(locationid);
		if(pList.size()!=0){ // 여행지가 있을때만 실행
			for(String place:pList){ 
				if(place!=null){
					List<TravelImageVO> imgList=outputTravelInfoDAO.getTotalPlaceImageList(place);
					if(imgList.size()!=0){
						// 해당 여행지의 이미지 하나만 가져온다 - 지역정보에서 보여줄 이미지
						list.add(imgList.get(0));
					}
				}
			}
			totalMap.put("imgList", list);
		}else{
			totalMap.put("notPlace", "여행지가 존재하지 않습니다!");
		}
		List<Map> rankList = outputTravelInfoDAO.getTravelPlaceRanking(locationid);
		if(rankList.size()!=0){
			boolean flag=false;
			for(Map map:rankList){
				if(Integer.parseInt(map.get("RECOMMEND").toString())!=0){
					flag=true;
				}
			}
			if(flag){
				totalMap.put("rankList", rankList);
			}else{// 지역에 존재하는 여행지 중에서 추천점수 있는 여행지가 하나도 없을 경우
				totalMap.put("notRank", "랭킹정보가 존재하지 않습니다!");
			}
		}else{
			totalMap.put("notRank", "랭킹정보가 존재하지 않습니다!");
		}
		return totalMap;
	}
	/**
	 * 여행지 정보 모두 가져오기 - 이미지, 숙박, 맛집, 공지, 댓글
	 */
	@Override
	public Map getTravelInfoOutput(Map map) throws SQLException {
		Map totalMap=new HashMap();
		TravelInfoVO tVO=outputTravelInfoDAO.getTravelInfo(map.get("place").toString());
		if(tVO!=null){
			totalMap.put("tVO",tVO);
		}
		List<String> imgList=outputTravelInfoDAO.getPlaceImageList(map.get("place").toString());
		if(imgList.size()==1){
			for(String str:imgList){
				totalMap.put("img",str);
			}
		}else{
			totalMap.put("imgList",imgList);
		}
		List<TravelVacancyVO> vList=outputTravelInfoDAO.getPlaceVacancyList(map.get("place").toString());
		if(vList.size()!=0){
			totalMap.put("vList", vList);
		}else{
			totalMap.put("notVacancy", "숙박정보가 존재하지 않습니다!");
		}
		List<TravelFrVO> fList=outputTravelInfoDAO.getPlaceFrList(map.get("place").toString());
		if(fList.size()!=0){
			totalMap.put("fList", fList);
		}else{
			totalMap.put("notFr", "맛집정보가 존재하지 않습니다!");
		}
		ArrayList<TravelCommentVO> cList=outputTravelInfoDAO.getTravelCommentList(map);
		System.out.println("map:"+map);
		System.out.println("cList:"+cList);
		if(cList.size()!=0){
			int contentCount=(int)outputTravelInfoDAO.getPlaceCommentCount(map.get("place").toString());
			PagingBean pagingBean=new PagingBean(contentCount,Integer.parseInt(map.get("page").toString()));
			ListVO lvo=new ListVO(cList,pagingBean);
			totalMap.put("lvo", lvo);
		}else{
			totalMap.put("notComment", "댓글이 존재하지 않습니다!");
		}
		return totalMap;
	}
	/**
	 * 존재하는 여행지 리스트 
	 */
	@Override
	public List<String> findTravelPlaceList(int locationid) throws SQLException {
		return outputTravelInfoDAO.findTravelPlaceList(locationid);
	}
	/**
	 * 여행정보 페이지에서 댓글 유무 확인을 위해
	 */
	@Override
	public TravelCommentVO getPlaceComment(TravelCommentVO commentVO)
			throws SQLException {
		return outputTravelInfoDAO.getPlaceComment(commentVO);
	}
}
